home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / hypercrd / xcmds / dvlprstc.hqx / Developer Stack 1.3r / card_22649.txt < prev    next >
Text File  |  1991-04-30  |  7KB  |  185 lines

  1. -- card: 22649 from stack: in.3r
  2. -- bmap block id: 0
  3. -- flags: 0000
  4. -- background id: 2202
  5. -- name: InsertInList
  6.  
  7.  
  8. -- part contents for background part 10
  9. ----- text -----
  10. 12
  11.  
  12. -- part contents for background part 19
  13. ----- text -----
  14. Functions
  15.  
  16. -- part contents for background part 3
  17. ----- text -----
  18. InsertInList
  19.  
  20. -- part contents for background part 2
  21. ----- text -----
  22. If you need to insert entries into an alphabetical list and need to know which line the new entry went into (such as if you needed to enter data that would be on the same line as the new entry but in another field) then you may find this function useful.  
  23.  
  24. InsertInList Function requires two parameters, a list and a new entry.  It returns the line number that the new entry would be BEFORE alphabetically in the list.  You would have to put the new entry and return before line (number returned) of the list.  The function can be used like this:
  25.  
  26. put InsertInList(newEntry,theList) into lineNum
  27.  
  28. As this is written in HyperTalk it is not lightning fast, but it is sufficient.  The function on the next card "FUNCTION ABC" is a little faster, but it needs the new entry and the list to be in all caps. 
  29.  
  30. copyright ┬⌐1988 - by Scott McGilliard
  31. all rights reserved
  32.  
  33.  
  34. -----------------------------------------------------------------------
  35. --    copyright ┬⌐1988 - by Scott McGilliard - all rights reserved    --
  36. --                                                                   --
  37. --  if you like this function and find it useful please send $5 to:  --
  38. --                        Scott McGilliard                           --
  39. --                        1515 Arborview                             --
  40. --                        Ann Arbor MI  48103                        --
  41. --                                                                   --
  42. --     if you use this function please keep this notice with it      --
  43. -----------------------------------------------------------------------
  44.  
  45. --mouseUp handler uses the variable it for the new entry and--
  46. --the field "list" for the list in calling function abc in place--
  47. --of the line number in the put command--
  48.  
  49. on mouseUp
  50.   ask "New entry?"
  51.   if it = empty then exit mouseUp
  52.   set cursor to 4
  53.   put it & return before line abc(it,field list) of field "list"
  54. end mouseUp
  55.  
  56. --function abc starts here--
  57.  
  58. function abc newEntry,theList
  59.   
  60.   --if the list is empty then the obvious line number is returned--
  61.   
  62.   if theList = empty then return(1)
  63.   
  64.   --sets up for the sort--
  65.   --Tmax and Tmin will store the original top and bottom of the list--
  66.   --while maxNum and minNum will change as the sort continues--
  67.   --gap is the number half way between the maximum and minimum of--
  68.   --the current segment being checked lineNum is the current line of--
  69.   --the list being checked - by checking the middle line of the list--
  70.   --the posibilities are cut in half with each comparison--
  71.   --with a 100 word list the maximum number of comparisons would--
  72.   --be 7 and with 200 words only 8 it's not quite that simple but--
  73.   --that's the concept behind this function--
  74.   
  75.   
  76.   put the number of lines of theList into maxNum
  77.   put maxNum into TMax
  78.   put 1 into minNum
  79.   put minNum into TMin
  80.   put maxNum div 2 into gap
  81.   if gap = 0 then put 1 into gap
  82.   put gap into lineNum
  83.   put 1 into whichChar
  84.   
  85.   --start the sort--
  86.   
  87.   repeat
  88.     
  89.     --uses another function to put the lower case ASCII number of the--
  90.     --two characters to be compared into variables to save time by--
  91.     --not having to convert each time they're compared--
  92.     
  93.     put toLow(char whichChar of newEntry) into newNum
  94.     put toLow(char whichChar of line lineNum of theList) into listNum
  95.     
  96.     --checks if entry belongs after this line of the list--
  97.     
  98.     if newNum > listNum then
  99.       
  100.       --if it's between current line and the next or if it's--
  101.       --the last line of the list or if list can't be narrowed any--
  102.       --farther the next line is returned--
  103.       
  104.       if newNum < toLow(char whichChar of line lineNum + 1┬¼
  105.       of theList) or lineNum = Tmax or maxNum = minNum
  106.       then return(lineNum + 1)
  107.       else
  108.         
  109.         --set up new minNum and gap for the next comparison--
  110.         
  111.         put lineNum into minNum
  112.         put gap div 2 into gap
  113.         if gap = 0 then put 1 into gap
  114.         put minNum + gap into lineNum
  115.       end if
  116.     else
  117.       
  118.       --checks if entry belongs before this line of the list--
  119.       
  120.       if newNum < listNum then
  121.         
  122.         --if it's between current line and the previous one--
  123.         --or if it's the first line of the list then the current--
  124.         --line is returned--
  125.         
  126.         if newNum > toLow(char whichChar of line lineNum - 1┬¼
  127.         of theList) or lineNum = Tmin then return(lineNum)
  128.         else
  129.           
  130.           --set up new maxNum and gap for the next comparison--
  131.           
  132.           put lineNum into maxNum
  133.           put gap div 2 into gap
  134.           if gap = 0 then put 1 into gap
  135.           put maxNum - gap into lineNum
  136.         end if
  137.       else
  138.         
  139.         --set up new maxNum and minNum--
  140.         
  141.         repeat with i = lineNum down to minNum
  142.           if newNum Γëá toLow(char whichChar of line i of theList) then
  143.             put i + 1 into minNum
  144.             exit repeat
  145.           end if
  146.         end repeat
  147.         repeat with i = lineNum to maxNum
  148.           if newNum Γëá toLow(char whichChar of line i of theList) then
  149.             put i - 1 into maxNum
  150.             exit repeat
  151.           end if
  152.         end repeat
  153.         
  154.         --if there is no character to compare then the new entry--
  155.         --matches all the characters of the current line and is--
  156.         --shorter than the current line so return the new minNum--
  157.         
  158.         add 1 to whichChar
  159.         if char whichChar of newEntry = empty then return(minNum)
  160.         
  161.         --set up a new TMax and TMin to have the sort deal with only--
  162.         --the part of the list that starts with matching characters--
  163.         
  164.         put maxNum into TMax
  165.         put minNum into TMin
  166.         
  167.         --set up a new gap and lineNum to compare--
  168.         
  169.         put (maxNum - minNum) div 2 into gap
  170.         if gap = 0 then put 1 into gap
  171.         if maxNum > minNum then put minNum + gap into lineNum
  172.         else put minNum into lineNum
  173.       end if
  174.     end if
  175.   end repeat
  176. end abc
  177.  
  178. --function to convert the ASCII number of a character to the--
  179. --lower case ASCII number--
  180.  
  181. function toLow az
  182.   if the charToNum of az >= 65 and the charToNum┬¼
  183.   of az <= 90 then return(the charToNum of az + 32)
  184.   else return(the charToNum of az)
  185. end toLow